package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net"
	"os"
)

func main() {
	filePath := "F:\\golang\\golang\\(传智播客)20小时快速入门go语言视频\\第7天视频\\3-视频\\31_并发聊天服务器：超时处理.mp4"

	info, err := os.Stat(filePath)

	errHandler(err)

	fileName := info.Name()

	fmt.Println("文件: ", fileName)

	//连接服务器
	conn, err := net.Dial("tcp", "127.0.0.1:8080")

	errHandler(err)

	//封装到map中
	sendMap := make(map[string]string, 1)

	sendMap["fileName"] = fileName

	//编码为json发送
	sendFileName, err := json.Marshal(sendMap)

	errHandler(err)

	//发送
	conn.Write([] byte(sendFileName))

	fmt.Println("向服务端发送 : ", sendFileName)

	fmt.Println("")

	//接收服务端响应
	serverResponse := make([] byte, 1024*8)

	//读取服务端响应
	n, err := conn.Read(serverResponse)

	//解析json封装到map
	serverResponseMap := make(map[string]string, 2)

	err = json.Unmarshal(serverResponse[0:n], &serverResponseMap)

	fmt.Println("服务端应答 : ", serverResponseMap)

	if serverResponseMap["status"] != "200" {
		fmt.Println("服务端响应错误 : ", serverResponseMap["status"])
		return
	}

	file, err := os.OpenFile(filePath, os.O_RDONLY, 438)

	fmt.Println("OpenFile err : ", err)

	fileBody := make([] byte, 1024*8)
	for ; ; {

		n, err := file.Read(fileBody)

		if err != io.EOF {

			//向服务端发送文件
			i, _ := conn.Write(fileBody[0:n])

			fmt.Println("向服务端发送body长度 : ", i)

		} else {

			//return
			//告诉客户端我发送完了
			conn.Write([] byte("SEND_OK"))

			fmt.Println("写完了,等待服务端确认!")

			i, _ := conn.Read(serverResponse)

			var sstr = string(serverResponse[0:i])

			fmt.Println(sstr)

			//如果服务端应答接收完成.完毕本次连接
			if sstr == "RECEIVE_OK" {

				fmt.Println("服务端应答 : ", sstr)
				return
			}

		}
	}

	//关闭连接
	defer func() {

		conn.Close()

	}()

}

func errHandler(err error) {

	if err != nil {

		fmt.Println(err)

	}
}
